package de.wellenblau.PaperBase {

	import flash.display.Sprite;
	import flash.events.Event;
	
	import org.papervision3d.view.Viewport3D;
	import org.papervision3d.cameras.*;
	import org.papervision3d.scenes.Scene3D;
	import org.papervision3d.render.BasicRenderEngine;
	
	public class PaperBaseFixed extends Sprite {
		
		public var viewport:Viewport3D;			//Die Fläche auf der Bühne in der die gerenderten Bilder gesteckt werden
		public var renderer:BasicRenderEngine;	//Die Renderengine
		public var default_scene:Scene3D;		//Die Standartszene
		public var default_camera:Camera3D;	//Eine freie 3D Kamer
		
		/**
		 * Nichts zu tun
		 */
		public function PaperBaseFixed(){
		}
		
		/**
		 * Hier werden die Initfunktionen für 2D,3D und Events gestartet.
		 * @param vpWidth Die Breite des Viewports
		 * @param vpHeight die Höhe des Viewports
		 */
		public function init(vpWidth:Number = 800, vpHeight:Number = 600):void {
			initPapervision(vpWidth, vpHeight);
			init3d();
			init2d();
			initEvents();
		}
		
		/**
		 * Papervision initialisieren
		 * @param vpWidth Die Breite des Viewports
		 * @param vpHeight die Höhe des Viewports
		 */
		protected function initPapervision(vpWidth:Number, vpHeight:Number):void {
			//Viewport erstellen
			viewport = new Viewport3D(vpWidth, vpHeight,false,true);
			//Viewport anzeigen
			addChild(viewport);
			//Den Renderer erstellen
			renderer = new BasicRenderEngine();
			//Die Hauptszene erstellen
			default_scene = new Scene3D();
			//Die Hauptkamera erstellen
			default_camera = new Camera3D();
		}
		
		/**
		 * Initalisieren der 3D Objekte
		 * -> wird überschrieben
		 */
		protected function init3d():void {
			
		}
		
		/**
		 * Initalisieren der 2D Objekte
		 * -> wird überschrieben
		 */
		protected function init2d():void {
			
		}
		
		/**
		 * Das onEnterFrameEvent wird erstellt
		 */
		protected function initEvents():void {
			addEventListener(Event.ENTER_FRAME, onEnterFrame);
		}
		
		/**
		 * Animation der Objekte.
		 * Wird vor dem rendern aufgerufen.
		 * -> wird überschrieben
		 */
		protected function processFrame():void {
			// Process any movement or animation here.
		}
		
		/**
		 * Rendert die Szene
		 */
		protected function onEnterFrame( ThisEvent:Event ):void {
			processFrame();
			renderer.renderScene(default_scene, default_camera, viewport);
		}
		
	}
	
}